/*******************************************************************************
 * Copyright (c) 2012 Daniele Parisi.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     Daniele Parisi
 *     neb.inf@gmail.com
 *     http://www.danieleparisi.com/
 ******************************************************************************/
package org.jxreport.core.views;

import java.util.HashMap;

import org.jxreport.core.HTMLUtils;
import org.jxreport.core.Table;
import org.jxreport.core.XMLUtils;
import org.jxreport.core.XMLValues;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public abstract class ViewObject {

	protected String id;
	protected String objectClass;
	protected String title;
	
	protected HashMap<String, String> cssProperties =  new HashMap<String, String>();
	
	protected Table table;
	
	public ViewObject(Element viewElement, Table table) {
		this.setTitle(XMLUtils.getTextValue(viewElement, XMLValues.TITLE));
		if(this.title == null) this.setTitle("Nessun Titolo");

		try{ this.setId(viewElement.getAttributes().getNamedItem(XMLValues.ID).getTextContent()); }
		catch(Exception e){this.setId("id_" + HTMLUtils.getRandomInt()); }

		this.setObjectClass(XMLUtils.getTextValue(viewElement, XMLValues.HTML_CLASS));
		if(this.objectClass == null) this.setObjectClass("");
		
		NodeList nl = viewElement.getElementsByTagName(XMLValues.CSS);
		if(nl.getLength() > 0) 
		{
			Element cssElement = (Element)nl.item(0);
			if(cssElement.getParentNode().getNodeName().equals(viewElement.getNodeName()))
			{
				NodeList nl2 = cssElement.getElementsByTagName(XMLValues.CSS_RULE);
				for(int i = 0 ; i < nl2.getLength();i++) {
					Element el = (Element)nl2.item(i);
					this.cssProperties.put(XMLUtils.getTextValue(el, XMLValues.RULE_NAME), 
							XMLUtils.getTextValue(el, XMLValues.RULE_VALUE));
				}
			}
		}
		
//		try{
//			NodeList nl = viewElement.getChildNodes();
//			for(int i = 0 ; i < nl.getLength();i++) {
//				Node node = nl.item(i);
//				if(node.getNodeName().equals(XMLValues.TITLE))
//				{
//					this.title = new Title();
//					try{ this.title.type = node.getAttributes().getNamedItem("type").getNodeValue(); }
//					catch(Exception e) { this.title.type = Title.H2; }
//
//					NodeList nlt = node.getChildNodes();
//					for (int j = 0; j < nlt.getLength(); j++) {
//						Node node2 = nlt.item(j);
//						
//						System.out.println("NODE: " + node2.getNodeName());
//						
//						if(node2.getNodeName().equals(XMLValues.CONTENT))
//							this.title.setContent(node2.getNodeValue());
//						
//						else if(node2.getNodeName().equals(XMLValues.CSS))
//						{
//							NodeList nl2 = node.getChildNodes();
//							for (int k = 0; j < nl2.getLength(); k++) {
//								Node cssNode = nl2.item(k);
//								if(!cssNode.getNodeName().equals("#text"))
//									this.title.getCssProperties().put(cssNode.getNodeName(), cssNode.getTextContent());
//							}
//						}
//					}
//				}
				//this.setTitle(new Title((Element)viewElement.getElementsByTagName("title").item(0), table));

//				if(node.getNodeName().equals(XMLValues.CLASS)) this.setHtmlClass(node.getNodeValue().trim());
//
//				if(node.getNodeName().equals(XMLValues.CSS))
//				{
//					System.out.println("CSS FOUND");
//					NodeList nl2 = node.getChildNodes();
//					for (int j = 0; j < nl2.getLength(); j++) {
//						
//						Node cssRuleNode = nl2.item(j);
//						
//						if(cssRuleNode.getNodeName().equals(XMLValues.CSS_RULE))
//						{
//							System.out.println("CSS RULE FOUND");
//
//							NodeList nl3 = cssRuleNode.getChildNodes();
//							Node nChild = null;
//							Node vChild = null;
//							for (int k = 0; k < nl3.getLength(); k++) {
//								Node node2 = nl3.item(k);
//								if(!node2.getNodeName().equals("#text"))
//								{
//									if(node2.getNodeName().equals(XMLValues.RULE_NAME)) nChild = node2;
//									if(node2.getNodeName().equals(XMLValues.RULE_VALUE)) vChild = node2;
//								}
//							}
//							
//							if(nChild != null && vChild != null)
//								this.cssProperties.put(nChild.getNodeValue(), vChild.getNodeValue());
//							System.out.println("CSS RULE ADDED");

//							Node fChild = cssRuleNode.getFirstChild();
//							Node lChild = cssRuleNode.getLastChild();
//							if(fChild.getNodeName().equals(XMLValues.RULE_NAME) &&
//									lChild.getNodeName().equals(XMLValues.RULE_VALUE))
//							{
//								this.cssProperties.put(fChild.getNodeValue(), lChild.getNodeValue());
//								System.out.println("CSS RULE ADDED");
							//}
//							System.out.println("fchild: " + fChild.getNodeValue());
//							System.out.println("lchild: " + lChild.getNodeValue());
//						}
						
//						if(!cssNode.getNodeName().equals("#text"))
//							this.cssProperties.put(cssNode.getNodeName(), cssNode.getTextContent());
//					}
//				}
//			}
			
			
//			NodeList nl = viewElement.getElementsByTagName("*");
//			for(int i = 0 ; i < nl.getLength();i++) {
//				Element el = (Element)nl.item(i);
//				if(el.getTagName().equals(XMLValues.TITLE)) 
//					this.setTitle(new Title((Element)viewElement.getElementsByTagName("title").item(0), table));
//
//				if(el.getTagName().equals(XMLValues.CLASS)) this.setHtmlClass(el.getTextContent());
//
//				if(el.getTagName().equals(XMLValues.CSS))
//				{
//					NodeList nl2 = el.getElementsByTagName("*");
//					for (int j = 0; j < nl2.getLength(); j++) {
//						Element el2 = (Element)nl2.item(j);
//						this.cssProperties.put(el2.getTagName(), el2.getTextContent());
//					}
//				}
//			}

//		} catch(Exception e){}
		
		this.table = table;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
	
	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}
	
//	public Title getTitle() {
//		return title;
//	}
//
//	public void setTitle(Title title) {
//		this.title = title;
//	}

	public String getObjectClass() {
		return objectClass;
	}

	public void setObjectClass(String objectClass) {
		this.objectClass = objectClass;
	}

	public HashMap<String, String> getCssProperties() {
		return cssProperties;
	}

	public void setCssProperties(HashMap<String, String> cssProperties) {
		this.cssProperties = cssProperties;
	}
}
